package com.jiashihui.schema_lgorithm.java.basics;

/**
 * @author jiashihui
 * @date 2019/04/11
 *
 * 整个 ConcurrentHashMap 由一个个 Segment 组成，Segment 代表”部分“或”一段“的意思，所以很多地方都会将其描述为分段锁。
 * 简单理解就是，ConcurrentHashMap 是一个 Segment 数组，Segment 通过继承 ReentrantLock 来进行加锁，所以每次需要加锁的操作锁住的是一个 segment，这样只要保证每个 Segment 是线程安全的，也就实现了全局的线程安全。
 */
public class ConcurrentHashMapTest {

}

/**
 * concurrencyLevel：并行级别、并发数、Segment 数，怎么翻译不重要，理解它。默认是 16，也就是说 ConcurrentHashMap 有 16 个 Segments，所以理论上，
 * 这个时候，最多可以同时支持 16 个线程并发写，只要它们的操作分别分布在不同的 Segment 上。这个值可以在初始化的时候设置为其他值，但是一旦初始化以后，它是不可以扩容的。
 *
 * get 过程中是没有加锁的，那自然我们就需要去考虑并发问题。
 * 添加节点的操作 put 和删除节点的操作 remove 都是要加 segment 上的独占锁的，所以它们之间自然不会有问题，
 * 我们需要考虑的问题就是 get 的时候在同一个 segment 中发生了 put 或 remove 操作。
 *
 * CAS:比较替换。
 *
 *
 *
 *
 */